Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


sbapp/plyer/tests/test_facade.py 0.2.4 (6b02a0c3) Text, 5.64 KB

T8b949e'''
TestFacade
==========

Tested platforms:

* Android
* iOS
* Windows
* MacOS
* Linux
'''

Tff7b72import T7ee787unittest

Tff7b72import T7ee787sys
Tff7b72from T7ee787types Tff7b72import Te6edf3MethodType

Tff7b72from T7ee787mock Tff7b72import Te6edf3MockTb4b4b4, Te6edf3patch

Tff7b72import T7ee787plyer


Tff7b72def Td2a8ffmock_platform_moduleTb4b4b4(Te6edf3modTb4b4b4, Te6edf3platformTb4b4b4, Tff7b72clsTb4b4b4)Tb4b4b4:
T8b949e'''
Create a stub module for a specific platform. This module contains:

* class inheriting from facade implementing the desired feature
* 'instance' function returning an instance of the implementing class
'''

T8b949e# assemble an instance returned from the instance() function
T8b949e# which is created from a dynamically created class
T8b949e# <class '<mod>.<platform><cls>'> e.g.:
T8b949e# <class 'plyer.platforms.win.dummy . WinDummy'>
Te6edf3stub_inst Tff7b72= Te6edf3MockTb4b4b4(
Tff7b72__module__Tff7b72=Te6edf3modTb4b4b4,
Tff7b72__class__Tff7b72=Tffa657typeTb4b4b4(
Ta5d6ff'Tffd700{}Tffd700{}Ta5d6ff'Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3platformTff7b72.Td2a8fftitleTb4b4b4(Tb4b4b4)Tb4b4b4, Tff7b72clsTb4b4b4)Tb4b4b4, Tb4b4b4(Tffa657objectTb4b4b4, Tb4b4b4)Tb4b4b4, Tb4b4b4{
Ta5d6ff'Ta5d6ff__module__Ta5d6ff'Tb4b4b4: Te6edf3mod
Tb4b4b4}
Tb4b4b4)Tb4b4b4,
Tb4b4b4)

T8b949e# manual 'return_value' assign to Mock, so that the instance() call
T8b949e# can return stub_inst's own instance instead of creating another
T8b949e# unnecessary Mock object
Te6edf3stub_instTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3stub_inst

T8b949e# bind custom function returning the class name to stub_inst instance,
T8b949e# so that instance().show() call requires 'self' i.e. instance parameter
T8b949e# for the function to access the instance's class name
Te6edf3stub_instTff7b72.Td2a8ffshow Tff7b72= Te6edf3MethodTypeTb4b4b4(Tff7b72lambda Te6edf3slfTb4b4b4: Te6edf3slfTb4b4b4, Te6edf3stub_instTb4b4b4)

Te6edf3stub_mod Tff7b72= Te6edf3MockTb4b4b4(Te6edf3instanceTff7b72=Te6edf3stub_instTb4b4b4)
Tff7b72return Te6edf3stub_mod


T8b949e# dummy pyjnius class to silence the import + config
Tff7b72class T56d364DummyJniusTb4b4b4:
T8b949e'''
Mocked PyJNIus module.
'''

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Tff7b72*Te6edf3argsTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwargsTb4b4b4)Tb4b4b4:
Tff7b72class T56d364JavaClassTb4b4b4:
T8b949e'''
Mocked PyJNIus JavaClass object.
'''

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffANDROID_VERSION Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffSDK_INT Tff7b72= T79c0ff1
Tff7b72selfTff7b72.Td2a8ffmActivity Tff7b72= Tff7b72None

Tff7b72selfTff7b72.Td2a8ffautoclass Tff7b72= Tff7b72lambda Tff7b72*Te6edf3aTb4b4b4, Tff7b72*Tff7b72*Te6edf3kwTb4b4b4: Te6edf3JavaClassTb4b4b4(Tb4b4b4)


Tff7b72class T56d364TestFacadeTb4b4b4(Te6edf3unittestTff7b72.Td2a8ffTestCaseTb4b4b4)Tb4b4b4:
T8b949e'''
TestCase for plyer.utils.Proxy and plyer.facades.
'''

Tff7b72def Td2a8fftest_facade_existing_platformsTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e'''
Test for returning an object for Android API implementation
from Proxy object using a dynamically generated dummy objects.
'''
Te6edf3_original Tff7b72= Te6edf3plyerTff7b72.Td2a8ffutilsTff7b72.Td2a8ffplatform

Tff7b72for Te6edf3plat Tff7b72in Tb4b4b4{Ta5d6ff'Ta5d6ffandroidTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffiosTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffwinTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ffmacosxTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6fflinuxTa5d6ff'Tb4b4b4}Tb4b4b4:
Te6edf3plyerTff7b72.Td2a8ffutilsTff7b72.Td2a8ffplatform Tff7b72= Te6edf3plat

Tff7b72if Te6edf3plat Tff7b72== Ta5d6ff'Ta5d6ffandroidTa5d6ff'Tb4b4b4:
T8b949e# android platform automatically imports jnius
Te6edf3sysTff7b72.Td2a8ffmodulesTb4b4b4[Ta5d6ff'Ta5d6ffjniusTa5d6ff'Tb4b4b4] Tff7b72= Te6edf3DummyJniusTb4b4b4(Tb4b4b4)

T8b949e# create stub module with instance func and class
Te6edf3stub_mod Tff7b72= Te6edf3mock_platform_moduleTb4b4b4(
Te6edf3modTff7b72=Ta5d6ff'Ta5d6ffplyer.platforms.Tffd700{}Ta5d6ff.dummyTa5d6ff'Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3platTb4b4b4)Tb4b4b4,
Te6edf3platformTff7b72=Te6edf3plyerTff7b72.Td2a8ffutilsTff7b72.Td2a8ffplatformTb4b4b4,
Tff7b72clsTff7b72=Ta5d6ff'Ta5d6ffDummyTa5d6ff'
Tb4b4b4)

Te6edf3proxy_cls Tff7b72= Te6edf3plyerTff7b72.Td2a8ffutilsTff7b72.Td2a8ffProxy
Te6edf3target Tff7b72= Ta5d6ff'Ta5d6ffbuiltins.__import__Ta5d6ff'

Tff7b72with Te6edf3patchTb4b4b4(Te6edf3targetTff7b72=Te6edf3targetTb4b4b4, Te6edf3return_valueTff7b72=Te6edf3stub_modTb4b4b4)Tb4b4b4:
Te6edf3dummy Tff7b72= Te6edf3proxy_clsTb4b4b4(Ta5d6ff'Ta5d6ffdummyTa5d6ff'Tb4b4b4, Te6edf3stub_modTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(
Tffa657strTb4b4b4(Te6edf3dummyTff7b72.Td2a8ff__class__Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff'Ta5d6ff"Tb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4,
Ta5d6ff'Ta5d6ffplyer.platforms.Tffd700{}Ta5d6ff.dummy.Tffd700{}Ta5d6ffDummyTa5d6ff'Tff7b72.Td2a8ffformatTb4b4b4(
Te6edf3platTb4b4b4, Te6edf3platTff7b72.Td2a8fftitleTb4b4b4(Tb4b4b4)
Tb4b4b4)
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(
Tffa657strTb4b4b4(Te6edf3dummyTff7b72.Td2a8ffshowTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__class__Tb4b4b4)Tff7b72.Td2a8ffsplitTb4b4b4(Ta5d6ff"Ta5d6ff'Ta5d6ff"Tb4b4b4)Tb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4,
Ta5d6ff'Ta5d6ffplyer.platforms.Tffd700{}Ta5d6ff.dummy.Tffd700{}Ta5d6ffDummyTa5d6ff'Tff7b72.Td2a8ffformatTb4b4b4(
Te6edf3platTb4b4b4, Te6edf3platTff7b72.Td2a8fftitleTb4b4b4(Tb4b4b4)
Tb4b4b4)
Tb4b4b4)

Te6edf3plyerTff7b72.Td2a8ffutilsTff7b72.Td2a8ffplatform Tff7b72= Te6edf3_original

Tff7b72def Td2a8fftest_facade_unknownTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e'''
Test fallback of Proxy to facade if there
is no such requested platform.
'''

Te6edf3_original Tff7b72= Te6edf3plyerTff7b72.Td2a8ffutilsTff7b72.Td2a8ffplatform
Te6edf3plyerTff7b72.Td2a8ffutilsTff7b72.Td2a8ffplatform Tff7b72= Ta5d6ff'Ta5d6ffunknownTa5d6ff'

T8b949e# no 'unknown' platform (folder), fallback to facade
Tff7b72class T56d364MockedProxyTb4b4b4(Te6edf3plyerTff7b72.Td2a8ffutilsTff7b72.Td2a8ffProxyTb4b4b4)Tb4b4b4:
T8b949e'''
Partially mocked Proxy class, so that we pull the error
from traceback.print_exc to the test and check the calls.
'''

T8b949e# _ensure_obj is called only once, to either
T8b949e# get the platform object or fall back to facade
T8b949e# therefore the three self.asserts below will return
T8b949e# different values
Te6edf3expected_asserts Tff7b72= Tb4b4b4[Tff7b72TrueTb4b4b4, Tff7b72FalseTb4b4b4, Tff7b72FalseTb4b4b4]

Tff7b72def Td2a8ff_ensure_objTb4b4b4(Te6edf3instTb4b4b4)Tb4b4b4:
T8b949e# called once, prints to stderr

T8b949e# mock stderr because traceback.print_exc uses it
T8b949e# https://github.com/python/cpython/blob/
T8b949e# 16dfca4d829e45f36e71bf43f83226659ce49315/Lib/traceback.py#L99
Te6edf3sysTff7b72.Td2a8ffstderr Tff7b72= Te6edf3MockTb4b4b4(Tb4b4b4)

T8b949e# call the original function to trigger
T8b949e# ImportError warnings in stderr
Tffa657superTb4b4b4(Te6edf3MockedProxyTb4b4b4, Te6edf3instTb4b4b4)Tff7b72.Td2a8ff_ensure_objTb4b4b4(Tb4b4b4)

T8b949e# Traceback (most recent call last):
T8b949e# File "/app/plyer/utils.py", line 88, in _ensure_obj
T8b949e# mod = __import__(module, fromlist='.')
T8b949e# ImportError: No module named unknown.dummy

T8b949e# must not use self.assertX
T8b949e# (has to be checked on the go!)
Te6edf3expected_bool Tff7b72= Te6edf3MockedProxyTff7b72.Td2a8ffexpected_assertsTff7b72.Td2a8ffpopTb4b4b4(T79c0ff0Tb4b4b4)
Te6edf3call_count Tff7b72= Te6edf3sysTff7b72.Td2a8ffstderrTff7b72.Td2a8ffwriteTff7b72.Td2a8ffcall_count
Tff7b72assert Tb4b4b4(Te6edf3call_count Tff7b72== T79c0ff6Tb4b4b4) Tff7b72== Te6edf3expected_boolTb4b4b4, Te6edf3call_count

T8b949e# return stderr to the original state
Te6edf3sysTff7b72.Td2a8ffstderr Tff7b72= Te6edf3sysTff7b72.Td2a8ff__stderr__

Te6edf3proxy_cls Tff7b72= Te6edf3MockedProxy
Te6edf3facade Tff7b72= Te6edf3MockTb4b4b4(Tb4b4b4)
Te6edf3dummy Tff7b72= Te6edf3proxy_clsTb4b4b4(Ta5d6ff'Ta5d6ffdummyTa5d6ff'Tb4b4b4, Te6edf3facadeTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffassertEqualTb4b4b4(Te6edf3dummyTff7b72.Td2a8ff_mock_new_parentTb4b4b4, Te6edf3facadeTb4b4b4)
Te6edf3plyerTff7b72.Td2a8ffutilsTff7b72.Td2a8ffplatform Tff7b72= Te6edf3_original


Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff'Ta5d6ff__main__Ta5d6ff'Tb4b4b4:
Te6edf3unittestTff7b72.Td2a8ffmainTb4b4b4(Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────